package com.hwd.gmall.product.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.hwd.gmall.model.product.BaseCategoryView;
import com.hwd.gmall.product.mapper.BaseCategoryViewMapper;
import com.hwd.gmall.product.service.IndexService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author 黄伟东/Victor
 * @date 2022/4/26 15:40
 */
@Service
public class IndexServiceImpl implements IndexService {

    @Resource
    private BaseCategoryViewMapper baseCategoryViewMapper;

    /**
     * 查询首页的分类信息
     *
     * @return java.util.List<com.alibaba.fastjson.JSONObject>
     */
    @Override
    public List<JSONObject> listIndexCategory() {

        // 查询一级分类信息，包含二级、三级分类的全部信息
        List<BaseCategoryView> baseCategoryViewList =
                baseCategoryViewMapper.selectList(null);

        // 根据一级分类id进行分组，每组的一级分类id相同，二级和三级分类不同
        Map<Long, List<BaseCategoryView>> category1Map =
                baseCategoryViewList.stream()
                        .collect(Collectors.groupingBy(BaseCategoryView::getCategory1Id));

        // 返回结果
        return category1Map.entrySet().stream().map(category1Entry -> {
            JSONObject category1Json = new JSONObject();
            // 获取一级分类id
            Long category1Id = category1Entry.getKey();
            category1Json.put("categoryId", category1Id);
            // 这个一级分类对应的所有的二级和三级分类
            List<BaseCategoryView> baseCategoryView1List = category1Entry.getValue();
            // 获取一级分类名字
            String category1Name = baseCategoryView1List.get(0).getCategory1Name();
            category1Json.put("categoryName", category1Name);

            // 获取一级分类的二级分类信息，并根据二级分类id进行分组，每组的二级分类id
            Map<Long, List<BaseCategoryView>> category2Map =
                    baseCategoryView1List.stream()
                            .collect(Collectors.groupingBy(BaseCategoryView::getCategory2Id));

            List<JSONObject> category2JsonList = category2Map.entrySet().stream().map(category2Entry -> {
                JSONObject category2Json = new JSONObject();
                // 获取二级分类id
                Long category2Id = category2Entry.getKey();
                category2Json.put("categoryId", category2Id);
                // 这个二级分类对应的所有的三级分类
                List<BaseCategoryView> baseCategoryView2List = category2Entry.getValue();
                // 获取二级分类名字
                String category2Name = baseCategoryView2List.get(0).getCategory2Name();
                category2Json.put("categoryName", category2Name);
                // 获取二级分类包含的三级分类信息，根据三级分类id进行分组
                Map<Long, List<BaseCategoryView>> category3Map =
                        baseCategoryView2List.stream()
                                .collect(Collectors.groupingBy(BaseCategoryView::getCategory3Id));

                List<JSONObject> category3JsonList = category3Map.entrySet().stream().map(baseCategoryView -> {
                    JSONObject category3Json = new JSONObject();
                    // 获取三级分类id
                    Long category3Id = baseCategoryView.getKey();
                    category3Json.put("categoryId", category3Id);
                    // 获取三级分类名字
                    String category3Name = baseCategoryView.getValue().get(0).getCategory3Name();
                    category3Json.put("categoryName", category3Name);
                    // 保存三级分类信息
                    return category3Json;
                }).collect(Collectors.toList());

                // 保存二级分类对应的所有三级分类信息
                category2Json.put("childCategory", category3JsonList);
                // 保存二级分类信息
                return category2Json;
            }).collect(Collectors.toList());

            // 保存一级分类对应的所有二级分类信息
            category1Json.put("childCategory", category2JsonList);
            // 返回一级分类的信息
            return category1Json;
        }).collect(Collectors.toList());
    }

    /**
     * 查询首页的分类信息
     *
     * @return java.util.List<com.alibaba.fastjson.JSONObject>
     */
    @Override
    public List<JSONObject> listCategory() {
        // 查询出所有一级二级三级分类信息
        List<BaseCategoryView> baseCategoryViews = baseCategoryViewMapper.selectList(null);

        // 根据一级分类id进行分组，得到一级分类的map
        Map<Long, List<BaseCategoryView>> category1Map =
                baseCategoryViews.stream().collect(Collectors.groupingBy(BaseCategoryView::getCategory1Id));

        // 对一级分类信息进行遍历
        List<JSONObject> category1JsonList = category1Map.entrySet().stream().map(category1Entry -> {

            // 使用JSONObject类型数据进行存储
            JSONObject category1Json = new JSONObject();

            // 保存一级分类id，name
            category1Json.put("categoryId", category1Entry.getKey());
            category1Json.put("categoryName", category1Entry.getValue().get(0).getCategory1Name());

            // 获取每个一级分类对应二级分类的信息
            List<JSONObject> category2JsonList = category1Entry.getValue().stream()
                    .collect(Collectors.groupingBy(BaseCategoryView::getCategory2Id))
                    .entrySet().stream()
                    .map(category2Entry -> {
                        JSONObject category2Json = new JSONObject();
                        // 保存二级分类id，name
                        category2Json.put("categoryId", category2Entry.getKey());
                        category2Json.put("categoryName", category2Entry.getValue().get(0).getCategory2Name());

                        List<JSONObject> category3JsonList = category2Entry.getValue().stream()
                                .map(baseCategoryView -> {
                                    JSONObject category3Json = new JSONObject();
                                    // 保存三级分类id，name
                                    category3Json.put("categoryId", baseCategoryView.getCategory3Id());
                                    category3Json.put("categoryName", baseCategoryView.getCategory3Name());

                                    return category3Json;
                                }).collect(Collectors.toList());

                        category2Json.put("childCategory", category3JsonList);

                        return category2Json;

                    }).collect(Collectors.toList());

            category1Json.put("childCategory", category2JsonList);

            return category1Json;

        }).collect(Collectors.toList());

        return category1JsonList;
    }
}